<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //回调：把函数当作另一个函数的参数传入，在另一个函数中调用它
    //递归：把函数当作自己函数本身的参数，在函数自身调用自己
    //递归执行时容易造成死循环，慎用！
    //把函数当作返回值   》闭包
    let fn = function(a,b){
        return a+b;
    };
    console.log((1,2));
    (function(){
        console.log('立即执行函数')
    })();
    let fn1 = function(a,b){
        return a+b;
    }
    let fn2 = function(f){
        return f;
    };
    console.log(fn2(fn1));
    console.log(fn2(fn1(1,2)));
    //作用域：变量作用的范围
    // js代码运行的两个阶段：
    // 1.解析（编译）：语法检查，声明变量和函数
    // 2.运行：变量赋值，按执行流程执行代码
    //var: let const
    //var和let的区别：
    //1.var可以重复声明变量，let不允许。
    //2.var允许变量声明提升，而let没有（暂时性死区）；>var允许先访问后声明，而let访问前必须声明变量
    var x = 10;
    console.log(x); //10
    var x ='hello';
    console.log(x)  //hello

    let a = 1;
    console.log(a);
    //let a = 'hello'  会报错,因为重复声明
    console.log('----------')
    console.log(t1);
    console.log(t2);
    var t1 = 123;
    //let t2 = 456;
    console.log('----------')
    //3.var和let都有全局作用域，函数作用域，对于let多了一个块作用域
    let num1 = 10;
    let num2 = 20;
    function fun(){
        //局部变量
        let f1 = 'hello';
        var f2 = 'javaScript';
        console.log(num1);
        console.log(num2);
        console.log(f1);
        console.log(f2);
    }
    fun()//
    console.log('----------')
        console.log(num1);//10
        console.log(num2);//20
       // console.log(f1);   let：局部变量在超出作用域范围后不能访问，会报错
       // console.log(f2);    var:局部变量在超出作用域范围后不能访问，会报错
       console.log('----------')
       //块作用域{}
       for(let i=0;i<3;i++){
        co
       nsole.log('let:'+i);
       }
       //console.log('i'+i);//在块作用域外无法访问其变量。

       for(var j=o;j<3;j++){
        console.log('var:'+j);
       }
       console.log('j:'+j);//3  在这里j相当于全局变量
</script>
